﻿#define _CRT_SECURE_NO_WARNINGS 1

// NC229296过桥

//链接：https://ac.nowcoder.com/acm/problem/229296
//来源：牛客网
//
//题目描述
//dd被困在了一个迷幻森林，现在她面前有一条凶险的大河，河中央有n个神奇的浮块，浮块按1∼n顺序标号，但两两并不相接，第i个浮块上有一个数字a[i]，
//可能是正数，也可能是负数, 每块浮块都附带一个魔法结界用于传送，当a[i]为正数时，dd可以选择传送到第i + k(1≤k≤a[i])个浮块上, 
//当dd抵达n号浮块时才可以顺利脱身，显然不管a[n]是多少，都没有任何意义，当a[i]为负时，dd只能选择标号小于等于i + a[i]的任意一块浮块进行传送，
//当i + a[i] < 1时，默认只能传送到1的位置，每次传送都会花费1s的时间，随着时间的流逝，迷雾森林的空气会被逐渐榨干，她现在在1号浮块，
//她想知道，她最快多久能顺利脱身，如果始终无法逃脱，请输出 −1
//
//输入描述 :
//第一行一个数n(2≤n≤2000)
//接下来一行n个数a[i](1≤ | a[i] | ≤2000)表示浮块上的数字
//输出描述 :
//输出一行，表示对应的答案
//示例1
//输入
//
//4
//2 2 - 1 2
//输出
//
//2
//说明
//1跳到2, 1s
//2跳到4, 1s
//共2s
//
//示例2
//输入
//
//2
//- 1 - 2
//输出
//
//- 1


// bfs层序遍历
#include <iostream>

using namespace std;

const int N = 2010;
int n, a[N];

int bfs()
{
    int left = 1, right = 1;
    int ret = 0;
    // 层序遍历
    while (left <= right)
    {
        ret++;
        int r = right;
        // 找下一层的区间
        for (int i = left; i <= right; i++)
        {
            r = max(r, a[i] + i); //找下一层的最右端点
            if (r >= n) return ret;//此时可以直接跳到n，直接返回结果
        }
        left = right + 1;
        right = r;
    }
    return -1;
}

int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];

    cout << bfs() << endl;
    return 0;
